//
//  SQLiteDataBaseManger.m
//  UI18-SQLite(数据库)
//
//  Created by 韩旭 on 16/8/8.
//  Copyright © 2016年 lanou. All rights reserved.
//

#import "SQLiteDataBaseManger.h"
#import <sqlite3.h>
#import "Student.h"
@implementation SQLiteDataBaseManger
//单利写法创建方式 只有一个对象
//单利不能够被释放，内存管理中
+(SQLiteDataBaseManger *)shareManger {
    static SQLiteDataBaseManger *manger = nil;
    static dispatch_once_t onceToken;
    //    保证线程安全只执行一次
    dispatch_once(&onceToken, ^{
        manger = [[SQLiteDataBaseManger alloc] init];
    });
    return manger;
}
//打开数据库
- (BOOL)openSQLite3 {
    NSArray *pathArr =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *document = [pathArr firstObject];
    //    数据库SQLite3.db
    NSString *pathName = [document stringByAppendingPathComponent:@"sqlite.db"];
    //    UTF8String 属性 将oc字符串转化成c语言字符串
    //    参数1：数据库文件路径
    //    参数2：指向指针的指针 该指针可以被修改 数据库管理指针
    NSLog(@"%@", pathName);
    
    int result = sqlite3_open(pathName.UTF8String, &dbPoint);
    //    sqlite3_open 当路经文件不存在时, 文件会被SQLite创建并打开
    //    当路径文件存在时，文件被直接打开
    
    //    sqlite3_open 返回值为int型，SQLITE_OK 0 代表成功；1.代表失败
    
    
    //    NSLog(@"%d", result);
    return [self isCloseOperationResult:result alertText:@"打开成功"];
}
//关闭数据库
- (BOOL)closeSQLite3 {
    int result = sqlite3_close(dbPoint);
    return [self isCloseOperationResult:result alertText:@"关闭成功"];
}
//操作成功
- (BOOL)isCloseOperationResult:(int)result alertText:(NSString *)text {
    //    关闭数据时, 如果数据库处于打开状态, 则正常关闭, 显示成功
    //    如果数据库处于关闭状态， 则显示失败, 原因21 ，库不存在
    BOOL isOperation = YES;
    if (result == SQLITE_OK) {
        isOperation = YES;
        NSLog(@"数据库%@成功", text);
    } else {
        NSLog(@"数据库%@%d失败", text,result);
        isOperation = NO;
    }
    return isOperation;
}
// 创建表
- (BOOL)creatTable
{
    //    sql语句
    //    创建表
    //    creat table表名（字段1 类型 约束，字段2，字段3）
    //    常用的约束
    //    primary key 一个表有且只能有一个主键
    //    autoincrement 自增，添加完该字段，系统会自己创建一个数据库
    //    sqlite_sequence, 用来保存自增的值
    //    not NULL 不能为空，为空会报sql错误
    //    删除整个表
    //    SQL语句：drop table 表名
    
    
    NSString *creatSQL = @"create table if not exists stu2 (stu_id integer primary key autoincrement, stu_name text not null)";
    int result = sqlite3_exec(dbPoint, creatSQL.UTF8String, NULL, NULL, NULL);
    return [self isCloseOperationResult:result alertText:@"创建表"];
}

//    添加数据
- (BOOL)insertStu:(Student *)stu {
    NSString *insertSQL = [NSString stringWithFormat:@"insert into stu1 (stu_id, stu_name) values (%ld, '%@')", stu.stu_id, stu.stu_name];
    //    自增字段， autoincrement
    //    默认如果填入null，值会从1开始
    //    如果填入其他值, 会从其他值开始，例：填入110， 值从110开始计算，并进行存储
    //    存储在sqlite_sequence中
    //    NSString *insertSQL = @"insert into stu2 (stu_id, stu_name) values (120,  。'郭宝')";
    int result = sqlite3_exec(dbPoint, insertSQL.UTF8String, NULL, NULL, NULL);
    return [self isCloseOperationResult:result alertText:@"添加"];
}
- (BOOL)deleteStu:(Student *)stu {
    NSString *deletSql = [NSString stringWithFormat:@"delete from stu1 where stu_id = %ld", stu.stu_id];
    int result = sqlite3_exec(dbPoint, [deletSql UTF8String], nil, nil, nil);
    NSString *alertText = [NSString stringWithFormat:@"删除%ld条数据", stu.stu_id];
    return [self isCloseOperationResult:result alertText:alertText];
}
- (BOOL)deleteAll {
    NSString *deleteSQL = @"delete from stu1 where 1=1";
    int result = sqlite3_exec(dbPoint, [deleteSQL UTF8String], nil, nil, nil);
    
    return [self isCloseOperationResult:result
                              alertText:@"删除全部"];
}
- (BOOL)upDateOldName:(NSString *)oldName newName:(NSString *)newName {
    
    //    update 表名 set 字段名 = 新值 where 字段名 = 旧值
    NSString *updateSQL = [NSString stringWithFormat:@"update stu1 set stu_name = '%@' where stu_name = '%@'", newName, oldName];
    int result = sqlite3_exec(dbPoint, updateSQL.UTF8String, nil, nil, nil);
    return [self isCloseOperationResult:result alertText:@"更新"];
}
- (NSArray *)selectName {
    //select 字段名，字段名 。。。from 表名 where 条件
    NSString *selectAll = @"select * from stu1";
    //    参数1. 数据库指针 sqlite3 *
    //    参数2. 数据库的sqlite语句
    //    参数3。sql语句的长度 -1 是不限制它的长度
    sqlite3_stmt *stmt = NULL;
    int result = sqlite3_prepare(dbPoint, [selectAll UTF8String], -1, &stmt, nil);
    NSMutableArray *stuArr = [NSMutableArray array];
    //    如果查询结果成功
    if (result == SQLITE_OK) {
        // 循环，遍历替身内容
        //        step 查询替身中有没有其他数据，
        //        当包含该有其他数据时，结果为SQLITE_ROW
        //        当不包含其他数据时， 结果为SQLITE_DONE
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //        循环体中，取对应每一列数据
            //          取出第0列的数据, 根据类型选择函数, int
            int stu_id = sqlite3_column_int(stmt, 0);
            //          取出第一列的数据 ，根据类型选择函数, text
            const unsigned char *stu_name = sqlite3_column_text(stmt, 1);
            Student *stu = [[Student alloc] init];
            stu.stu_id = stu_id;
            stu.stu_name = [NSString stringWithUTF8String:(const char *)stu_name];
            [stuArr addObject:stu];
        }
    }
//    循环结束后销毁对象
    sqlite3_finalize(stmt);
    //    参数4. 替身，查询出的内荣放入替身中, 并将替身返回
    return stuArr;
}
@end